/*
 * ComunicadorEventos.cpp
 *
 *  Created on: 10/11/2013
 *      Author: juliansci
 */

#include "ComunicadorEventos.h"
#include "../modelo/UnidadLogica.h"
#include <iostream>
#include <stdlib.h>
#include <sstream>
#include <vector>
#include "windows.h"
/*
 * Codigo general 0: devuelve con X e Y
 * MouseMotion: 0
 * MouseMotionBotonIzqApretado: 1
 * MouseMotionBotonDerApretado: 2
 * BotonIzqClick: 3
 * BotonIzqUP: 4
 * BotonDerClick: 5
 * BotonDerUp: 6
 *
 * Codigo general 1: Relacionado con teclado sin x e y
 * shift: 0
 * a: 1
 * r: 2
 * d: 3
 * i: 4
 * z: 5
 * keyUp: 6
 * clickPlay: 7
 * clickStop: 8
 *
 *
 *
 *
 */
ComunicadorEventos::ComunicadorEventos() {
	clickEnShift = false;
	tiempoShift = 0;
	parXeY.first = 0;
	parXeY.second = 0;
	inicializarEstados();
}

ComunicadorEventos::~ComunicadorEventos() {
	// TODO Auto-generated destructor stub
}

void ComunicadorEventos::inicializarEstados() {

	estadoMouseMotion = false;
	estadoMouseMotionIzqApretado = false;
	estadoMouseMotionDerApretado = false;
	estadoClickIzqDown = false;
	estadoClickIzqUp = false;
	estadoClickDerDown = false;
	estadoClickDerUp = false;
	estadoPlay = false;
	estadoStop = false;
	estadoShift = false;
	estadoTeclaA = false;
	estadoTeclaR = false;
	estadoTeclaD = false;
	estadoTeclaI = false;
	estadoTeclaZ = false;
	estadoKeyUp = false;

}

string ComunicadorEventos::escribirEventos(SDL_Event e, Ventana* ventana) {
	stringstream ss;
	int x, y, codigoGeneral, codigoLocal;
	UnidadLogica* unidadLogica = UnidadLogica::obtenerInstancia();

	if (e.type == SDL_MOUSEMOTION) {
		codigoGeneral = 0;
		codigoLocal = 0;
		x = e.motion.x;
		y = e.motion.y;
		pair<int, int> parUL = unidadLogica->convertirPixelAUL(x, y);
		ss << codigoGeneral << ";" << codigoLocal << ";" << parUL.first << ";"
				<< parUL.second << "|";
	}

	if (e.type == SDL_MOUSEMOTION && e.motion.state == SDL_BUTTON_RMASK) {
		codigoGeneral = 0;
		codigoLocal = 2;
		x = e.motion.x;
		y = e.motion.y;
		pair<int, int> parUL = unidadLogica->convertirPixelAUL(x, y);
		ss << codigoGeneral << ";" << codigoLocal << ";" << parUL.first << ";"
				<< parUL.second << "|";
	}

	if (e.type == SDL_MOUSEMOTION && e.motion.state == SDL_BUTTON_LMASK) {
		codigoGeneral = 0;
		codigoLocal = 1;
		x = e.motion.x;
		y = e.motion.y;
		pair<int, int> parUL = unidadLogica->convertirPixelAUL(x, y);
		ss << codigoGeneral << ";" << codigoLocal << ";" << parUL.first << ";"
				<< parUL.second << "|";
	}

	if (e.button.type
			== SDL_MOUSEBUTTONDOWN&& e.button.button == SDL_BUTTON_LEFT) {
		codigoGeneral = 0;
		codigoLocal = 3;
		x = e.button.x;
		y = e.button.y;
		pair<int, int> parUL = unidadLogica->convertirPixelAUL(x, y);
		ss << codigoGeneral << ";" << codigoLocal << ";" << parUL.first << ";"
				<< parUL.second << "|";
	}

	if (e.type == SDL_MOUSEBUTTONUP && e.button.button == SDL_BUTTON_LEFT) {
		codigoGeneral = 0;
		codigoLocal = 4;
		x = e.button.x;
		y = e.button.y;
		pair<int, int> parUL = unidadLogica->convertirPixelAUL(x, y);
		ss << codigoGeneral << ";" << codigoLocal << ";" << parUL.first << ";"
				<< parUL.second << "|";
	}

	if (e.button.type
			== SDL_MOUSEBUTTONDOWN&& e.button.button == SDL_BUTTON_RIGHT) {
		codigoGeneral = 0;
		codigoLocal = 5;
		x = e.button.x;
		y = e.button.y;
		pair<int, int> parUL = unidadLogica->convertirPixelAUL(x, y);
		ss << codigoGeneral << ";" << codigoLocal << ";" << parUL.first << ";"
				<< parUL.second << "|";
	}

	if (e.type == SDL_MOUSEBUTTONUP && e.button.button == SDL_BUTTON_RIGHT) {
		codigoGeneral = 0;
		codigoLocal = 6;
		x = e.button.x;
		y = e.button.y;
		pair<int, int> parUL = unidadLogica->convertirPixelAUL(x, y);
		ss << codigoGeneral << ";" << codigoLocal << ";" << parUL.first << ";"
				<< parUL.second << "|";
	}
	if (clickEnShift) {

		codigoGeneral = 1;
		codigoLocal = 0;
		ss << codigoGeneral << ";" << codigoLocal << "|";
		if (e.type == SDL_KEYDOWN
				&& (e.key.keysym.sym == SDLK_LSHIFT
						|| e.key.keysym.sym == SDLK_RSHIFT)) {
			tiempoShift = 0;
			clickEnShift = true;
		} else {
			tiempoShift++;
			if (tiempoShift > 50) {
				clickEnShift = false;
			}
		}
	} else {
		if (e.type == SDL_KEYDOWN
				&& (e.key.keysym.sym == SDLK_LSHIFT
						|| e.key.keysym.sym == SDLK_RSHIFT)) {
			tiempoShift = 0;
			codigoGeneral = 1;
			codigoLocal = 0;
			ss << codigoGeneral << ";" << codigoLocal << "|";
			clickEnShift = true;
		} else {
			tiempoShift++;
			clickEnShift = false;

		}
	}
	if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_a) {
		codigoGeneral = 1;
		codigoLocal = 1;
		ss << codigoGeneral << ";" << codigoLocal << "|";
	}

	if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_r) {
		codigoGeneral = 1;
		codigoLocal = 2;
		ss << codigoGeneral << ";" << codigoLocal << "|";
	}

	if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_d) {
		codigoGeneral = 1;
		codigoLocal = 3;
		ss << codigoGeneral << ";" << codigoLocal << "|";
	}

	if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_i) {
		codigoGeneral = 1;
		codigoLocal = 4;
		ss << codigoGeneral << ";" << codigoLocal << "|";
	}
	if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_z) {
		codigoGeneral = 1;
		codigoLocal = 5;
		ss << codigoGeneral << ";" << codigoLocal << "|";
	}
	if (e.type == SDL_KEYUP) {
		codigoGeneral = 1;
		codigoLocal = 6;
		ss << codigoGeneral << ";" << codigoLocal << "|";
		clickEnShift = false;
	}

	if (!ventana->getMenu()->isModoEdicion()
			&& ventana->getMenu()->isClickPlayStop()) {
		ventana->getMenu()->setClickPlayStop(false);
		codigoGeneral = 1;
		codigoLocal = 7;
		ss << codigoGeneral << ";" << codigoLocal << "|";
	}
	if (ventana->getMenu()->isModoEdicion()
			&& ventana->getMenu()->isClickPlayStop()) {
		ventana->getMenu()->setClickPlayStop(false);
		codigoGeneral = 1;
		codigoLocal = 8;
		ss << codigoGeneral << ";" << codigoLocal << "|";

	}
	string resp = ss.str();
	//cout << "mensaje de evento aenvbiar: " << resp << endl;
	return resp;
}

void ComunicadorEventos::leerEvento(string evento) {
	char separadorExterior = '|';
	char separadorInterior = ';';
//	cout << "evento a leer" << evento << endl;
	istringstream issExterior(evento);
	string eventoActual = "";
	string campoActual = "";
	vector<string> campos;
	while (getline(issExterior, eventoActual, separadorExterior) != NULL) {
		istringstream issInterior(eventoActual);
		campos.clear();
		while (getline(issInterior, campoActual, separadorInterior) != NULL) {
			campos.push_back(campoActual);
		}
		string codigoGeneral = campos.at(0);
		string codigoLocal = campos.at(1);
		if (codigoGeneral == "0") {
			string x = campos.at(2);
			string y = campos.at(3);
			parXeY.first = atof(x.c_str());
			parXeY.second = atof(y.c_str());
		}
		/*cout << "codigo general: " << codigoGeneral << endl;
		cout << "codigo local: " << codigoLocal << endl;*/
		switch (atoi(codigoGeneral.c_str())) {
		case 0:
			switch (atoi(codigoLocal.c_str())) {
			case 0:
				estadoMouseMotion = true;
				break;
			case 1:
				estadoMouseMotionIzqApretado = true;
				break;
			case 2:
				estadoMouseMotionDerApretado = true;
				break;
			case 3:
				estadoClickIzqDown = true;
				break;
			case 4:
				estadoClickIzqUp = true;
				break;
			case 5:
				estadoClickDerDown = true;
				break;
			case 6:
				estadoClickDerUp = true;
				break;
			}
			break;
		case 1:
			switch (atoi(codigoLocal.c_str())) {
			case 0:
				estadoShift = true;
				clickEnShift = true;
				break;
			case 1:
				//cout << "Tecla A true" << endl;
				estadoTeclaA = true;
				break;
			case 2:
				estadoTeclaR = true;
				break;
			case 3:
				estadoTeclaD = true;
				break;
			case 4:
				estadoTeclaI = true;
				break;
			case 5:
				estadoTeclaZ = true;
				break;
			case 6:
				estadoKeyUp = true;
				clickEnShift = false;

				break;
			case 7:
				estadoPlay = true;
				break;
			case 8:
				estadoStop = true;
				break;
			}
			break;
		}

	}
	if (clickEnShift) {
		estadoShift = true;
	} else {
		estadoShift = false;
	}
}
